iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

重新學 Go 30 天系列 第 8

[GO30] Day8 Error

  • 分享至 

  • xImage
  •  

在Go中,錯誤是一個內建的 interface 類型,其定義如下:

type error interface {
    Error() string
}

這個 interface 只有一個方法,即Error()方法,該方法返回一個 string,表示錯誤的訊息。任何 struct 實作了這個介面,就表示它是一個 Error。

建立錯誤

可以使用內建的errors套件來建立簡單的錯誤,例如:

import "errors"

err := errors.New("這是一個錯誤")

也可以用 fmt 建立錯誤

import "fmt"

err := fmt.Errorf("自訂錯誤")

返回錯誤

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("除數不能為零")
    }
    return a / b, nil
}

處理錯誤

這可以通過if語句或if err != nil來實現。

result, err := divide(10, 0)
if err != nil {
    fmt.Println("發生錯誤:", err)
} else {
    fmt.Println("結果:", result)
}

自定義錯誤類型

可以通過創建實現error接口的自定義類型來提供更多的錯誤信息和上下文信息。

type MyError struct {
    message string
}

func (e *MyError) Error() string {
    return e.message
}

func doSomething() error {
    return &MyError{"這是一個自定義錯誤"}
}

錯誤鏈

在處理錯誤時,可以使用fmt.Errorf來建立錯誤鏈,將多個錯誤信息組合在一起以提供更多上下文信息。

func readConfig() error {
    // ...
    if err := validateConfig(); err != nil {
        return fmt.Errorf("配置無效: %w", err)
    }
    // ...
    return nil
}

錯誤處理最佳實踐

Go推崇錯誤處理的最佳實踐是在每個可能返回錯誤的函數調用後都要檢查錯誤,並在調用者處處理錯誤,而不是在深層堆疊中拋出異常。


上一篇
[GO30] Day7 Loop
下一篇
[GO30] Day9 If else, switch case
系列文
重新學 Go 30 天10
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
雷N
iT邦研究生 1 級 ‧ 2023-09-24 00:15:17

期待能講更多關於Error產生的用法
像是wrap, join等, 適合用的場景

我要留言

立即登入留言